class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        vector<int> ret(2, 0);
        int tmp = 0;

        // 先全部异或一遍
        for (int i = 1; i <= nums.size() + 2; i++)
            tmp ^= i;

        for (const auto& e : nums)
            tmp ^= e;

        // 找第 x 位的比特位是 1 的位置
        int x = 0;
        for (int i = 0; i < 32; i++)
        {
            if ((tmp & 1) == 1)
            {
                x = i;
                break;
            }
            tmp >>= 1;
        }

        // 根据 x 位的比特位不同分成两类
        for (int i = 1; i <= nums.size() + 2; i++)
        {
            if (((i >> x) & 1) == 1)
                ret[0] ^= i;
            else
                ret[1] ^= i;
        }

        for (const auto& e : nums)
        {
            if (((e >> x) & 1) == 1)
                ret[0] ^= e;
            else
                ret[1] ^= e;
        }

        return ret;
    }
};